// 此文件编写和业务无关的工具方法
export function isJSON(str) {
  if (typeof str == 'string') {
    try {
      var obj = JSON.parse(str);
      if (typeof obj == 'object' && obj) {
        return true;
      } else {
        return false;
      }

    } catch (e) {
      console.log('error：' + str + '!!!' + e);
      return false;
    }
  }
}

export function isUndefined(val) {
  return typeof val === 'undefined';
}

export function isObject(obj) {
  return Object.prototype.toString.call(obj) === '[object Object]';
}

function isPromise(obj) {
  return 'function' == typeof obj.then;
}

export function isObjectNull(obj) {
  return Object.values(obj).length > 0 ? true : false
}

// 保证fn返回resolve状态
function toResolvedPromise(fn) {
  return new Promise((resolve, reject) => {
    let result = fn();

    // 非promise结果直接返回
    if (!isPromise(result)) {
      console.log('not promise');
      return resolve(result)
    }

    result.then((data) => {
      resolve(data)
    }).catch((err) => {
      console.log('error:', err);
      resolve(null);
    })
  })
}

// 顺序执行promise
export function runPromiseInSequence(promiseArr) {
  const arr = [];
  async function run() {
    for(let p of promiseArr) {
      const val = await toResolvedPromise(p);
      arr.push(val);
    }
    return arr;
  }
  return run();
}

// 是否是手机号
export function isPhone(phoneNum) {
  const reg = /^1[3-9]\d{9}$/g;
  return reg.test(phoneNum);
}

// 将对象转为key=value字符串，中间&连接
export function convertObj2Str(obj) {
  if (!obj || !Object.keys(obj).length) {
    return '';
  }
  
  const items = [];
  for(let [key, value] of Object.entries(obj)) {
    items.push(`${key}=${value}`);
  }
  return items.join('&');
}

export function base64ToFile(byteString, mimeString, fileName) {
    let ab = new ArrayBuffer(byteString.length);
    let ia = new Uint8Array(ab);
    for (let i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    const blob = new Blob([ab], { type: mimeString });
	
	let file = new File([blob], fileName, {
		type: blob.type,
		lastModified: Date.now()
	});
	return file;
}

// 防抖函数
export function debounce(fn, delay = 1000, immediate = false, resultCallback) {
  // 用于记录上一次事件触发的timer
  let timer = null
  let isInvoke = false

  // 触发事件时执行的函数
  const _debounce = function(...args) {
    return new Promise((resolve, reject) => {
      try {
        // 如果有再次触发(更多次触发)事件, 那么取消上一次的事件
        if (timer) clearTimeout(timer)

        // 第一次操作是不需要延迟
        let res = undefined
        if (immediate && !isInvoke) {
          res = fn.apply(this, args)
          if (resultCallback) resultCallback(res)
          resolve(res)
          isInvoke = true
          return
        }

        // 延迟去执行对应的fn函数(传入的回调函数)
        timer = setTimeout(() => {
          res = fn.apply(this, args)
          if (resultCallback) resultCallback(res)
          resolve(res)
          timer = null // 执行过函数之后, 将timer重新置null
          isInvoke = false
        }, delay);
      } catch (error) {
        reject(error)
      }
    })
  }

  // 给_debounce绑定一个取消的函数
  _debounce.cancel = function() {
    if (timer) clearTimeout(timer)
    timer = null
    isInvoke = false
  }

  // 返回一个新的函数
  return _debounce
}

export function toast(str, showCancel = true) {
	// #ifdef APP-PLUS
	plus.nativeUI.toast(str, {
		verticalAlign: 'center'
	});
	// #endif
	// #ifdef H5
	uni.showModal({
		content: str,
		showCancel: showCancel
	});
	// #endif
}


